#!/bin/bash

# Consolidation of Database Information System

# Este script é responsável pela extração de informações relativas a banco da dados PostgreSQL.
# O mesmo busca os sockets PostgreSQL que devem estar localizados no diretório /tmp/ ou /var/run/pgsql.
# Estes sockets são o ponto de partida para a aquisição de todas as informações relativas ao cluster de banco de dados.

# A saída deste script é um arquivo em formato CSV que respeita a seguinte regra:

# IP_SRV;NM_SRV;DOMINIO;PORTA;VERSÃO;PADRAO;DIR_BIN;AMBIENTE;DIR_DADOS;NM_BASES;NM_USER

# Dentro dos arquivos socket temos a informação do diretório de dados e do PID postmaster. No nome do arquivo é possível recuperar a porta de escuta.

# Definição de variáveis de saída.
IP_SERVIDOR=$(hostname -i)
NM_SERVIDOR=$(hostname)
SO=$(uname -o)
VSSO=$( [ -f /etc/redhat-release ] && cat /etc/redhat-release || [ -f /etc/debian_version ] && echo -n "Debian "$(cat /etc/debian_version) )
ARQUITETURA=$(uname -i)
DOMINIO=PostgreSQL
PORTA=
VERSAO=
PADRAO=
DIR_BINARIOS=
AMBIENTE=
DIR_DADOS=
NM_BASE=
NM_USUARIOS=

# Definição de variáveis de controle.
LST_SOCK_FILES=$(ls /tmp/.s.PGSQL.*.lock)
LST_BANCOS=
DIR_SAIDA=saida


for i in $LST_SOCK_FILES
do
	# Porta
	PORTA=$(echo $i | cut -f 4 -d .)

	# Diretório de Dados
	DIR_DADOS=$(cat $i | tail -1)

	# Versão do Cluster
	VERSAO=$(cat $DIR_DADOS/PG_VERSION)

	# Flag Base Padronizada
	if [[ $DIR_DADOS =~ '/opt/dbfiles/postgres/[0-9].[0-9]/[hpt]_[0-9]{5}_*' ]] 
	then
		PADRAO=S
	else
		PADRAO=N
	fi

	# Diretório dos Binários
	DIR_BINARIOS=$(cat $DIR_DADOS/postmaster.opts | cut -f 1 -d " "| xargs dirname)

	# Pegando as informações relativas aos bancos de dados.
	LST_BANCOS=$(psql -lt -p $PORTA | egrep -v 'postgres'\|'template'\|'^$' | cut -f 1 -d \| | tr -d ' ')
	for j in $LST_BANCOS
	do
		AMBIENTE=$(echo $j | cut -c3)
		NM_BASE=$j

		# Pegando os usuários
		NM_USUARIOS=$(psql -p $PORTA -c "select usename from pg_user" | grep -i $(echo $NM_BASE | cut -f3 -d _) | tr -d " " | grep ${AMBIENTE}$ | xargs)

		# Imprimindo Tudo.
	        echo "$IP_SERVIDOR;$NM_SERVIDOR;$SO;$VSSO;$ARQUITETURA;$DOMINIO;$PORTA;$VERSAO;$PADRAO;$DIR_BINARIOS;$AMBIENTE;$DIR_DADOS;$NM_BASE;$NM_USUARIOS" >> $DIR_SAIDA/$NM_SERVIDOR.data
	done
done

